package com.zang.greedy;

/**
 * @author ZVerify
 * @since 2022/11/19 21:16
 * @see <a href="https://leetcode.cn/problems/assign-cookies/">...</a>
 **/
public class 摆动序列 {

    public int wiggleMaxLength(int[] nums) {
        // 从第二个开始比较，所以前置数据为第一个值
        int pre = nums[0];
        // 因为还没有浮动所以为0
        int previous = 0;
        // 长度
        int sum = 1;
        for (int i = 1; i < nums.length; i++) {
            // 拿到当前值
            int thisNum = nums[i];
            // 计算差值
            int thisvision = thisNum-pre;
            // 当前值变成上一个的值用于下次比较
            pre = thisNum;

            // 如果浮动有变动就添加
            if ((thisvision > 0 && previous <= 0) || (thisvision < 0 && previous >= 0)) {
                sum++;
                previous = thisvision;
            }
        }
        return sum;
    }
    /**
     * 其实我自己想出来的是第二种，不过代码太多了没想到可以用boolean的包装类判断是不是第一次，后来参考别人的才明白
     */
    public int wiggleMaxLengthTwo(int[] nums) {

        if (nums==null) return 0;
        if (nums.length==1) return 1;
        Boolean flag = null;
        int sum = 1;
        for (int i = 1; i < nums.length; i++) {
            // 相等直接进行下一次
            if (nums[i]== nums[i-1]) continue;
            // 如果上升
            if (nums[i] - nums[i-1] > 0){
                // 判断是不是第一次并且判断上一次是不是上升，有值说明是第二次如果是上升和上一次一样直接进行下一次判断
                if (flag != null && flag) continue;
                // 进行摆动计数，以及更新摆动方向
                sum++;
                flag = true;
            }else {
                // 判断是不是第一次并且判断上一次是不是下降，有值说明是第二次如果是下降和上一次一样直接进行下一次判断
                if (flag != null && !flag) continue;
                // 进行摆动计数，以及更新摆动方向
                sum++;
                flag = false;
            }
        }
        return sum;
    }
}
